roundedbox: Clamp border radius to box size
authorAndrea Cimitan <andrea.cimitan@canonical.com>
Wed, 20 Jul 2011 21:37:26 +0000 (23:37 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 21 Jul 2011 00:43:54 +0000 (02:43 +0200)
Note that clamping in rounded_box_grow() is not necessary as that
function cannot lead to overlap unless the rounded box was overlapping
previously.

https://bugzilla.gnome.org/show_bug.cgi?id=655009

gtk/gtkroundedbox.c

index 5b1eefcfe1ad43a6a16a4650b56bd42fc3ac6345..c6512c110899fc029a22e6302aa0a0249bb3f908 100644 (file)
@@ -48,6 +48,32 @@ _gtk_rounded_box_init_rect (GtkRoundedBox *box,
   memset (&box->border_radius, 0, sizeof (GtkCssBorderRadius));
 }
 
+/* clamp border radius, following CSS specs */
+static void
+gtk_rounded_box_clamp_border_radius (GtkRoundedBox *box)
+{
+  gdouble factor = 1.0;
+
+  /* note: division by zero leads to +INF, which is > factor, so will be ignored */
+  factor = MIN (factor, box->box.width / (box->border_radius.top_left.horizontal +
+                                          box->border_radius.top_right.horizontal));
+  factor = MIN (factor, box->box.height / (box->border_radius.top_right.vertical +
+                                           box->border_radius.bottom_right.vertical));
+  factor = MIN (factor, box->box.width / (box->border_radius.bottom_right.horizontal +
+                                          box->border_radius.bottom_left.horizontal));
+  factor = MIN (factor, box->box.height / (box->border_radius.top_left.vertical +
+                                           box->border_radius.bottom_left.vertical));
+
+  box->border_radius.top_left.horizontal *= factor;
+  box->border_radius.top_left.vertical *= factor;
+  box->border_radius.top_right.horizontal *= factor;
+  box->border_radius.top_right.vertical *= factor;
+  box->border_radius.bottom_right.horizontal *= factor;
+  box->border_radius.bottom_right.vertical *= factor;
+  box->border_radius.bottom_left.horizontal *= factor;
+  box->border_radius.bottom_left.vertical *= factor;
+}
+
 void
 _gtk_rounded_box_apply_border_radius (GtkRoundedBox    *box,
                                       GtkThemingEngine *engine,
@@ -75,6 +101,8 @@ _gtk_rounded_box_apply_border_radius (GtkRoundedBox    *box,
   if (bottom_left_radius && (junction & GTK_JUNCTION_CORNER_BOTTOMLEFT) == 0)
     box->border_radius.bottom_left = *bottom_left_radius;
 
+  gtk_rounded_box_clamp_border_radius (box);
+
   g_free (top_left_radius);
   g_free (top_right_radius);
   g_free (bottom_right_radius);